package com.ys.作业;

import java.util.Random;

/**
 * 描述:
 * 生成指定范围的随机数
 *
 * @author CodeYang
 * @version 2020/12/24 0:00
 */
public class 生成1到23之间的随机数06 {
    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            int i1 = areaRandom(10, 23);
            System.out.print(i1 + "\t");
        }
        System.out.println("-----------------");
        for (int i = 0; i < 100; i++) {
            int i1 = areaRandom2(0, 10);
            System.out.print(i1 + "\t");
        }
        System.out.println("-----------------");
        for (int i = 0; i < 100; i++) {
            int i1 = areaRandom3(0, 10);
            System.out.print(i1 + "\t");
        }

    }

    /**
     * 方式一: Math.random() 生成一个 [0.0,1) 之间的随机数
     * (int) (Math.random() * (max - min + 1)) + min
     * 生成指定范围的随机数
     * @param max
     * @param min
     * @return 返回一个 [min-max] 之间的随机数
     */
    static int areaRandom(int min, int max) {
        // 如果要返回 [min-max) 不+1 即可 这样就 娶不到
        return (int) (Math.random() * (max - min + 1)) + min;
    }

    /**
     * 实现方式2:
     *  new Random();
     *  - 解析
     * random.nextInt(max) -> [0,max)
     * random.nextInt(max)+min -> [0+min-max+min)->[min,max+min)
     * random.nextInt(max+1)+min  ->[min,max+min+1)-加1就可以取到前一位了->[min,max+min]
     * 如果是这样: ---不可取
     * random.nextInt(max)+min +1 ->[min+1,max+min+1)-加1就可以取到前一位了->[min+1,max+min] 取不到最小值
     * random.nextInt(max+1)+min  ->[min,max+min+1)-加1就可以取到前一位了->[min,max+min]
     * random.nextInt(max-min+1)+min -> ->[min,max+min-min] ->[min,max]
     *  随机数 指定范围公式: random.nextInt(max - min ) + min+ 1
     * @param min
     * @param max
     * @return 返回一个 [min-max] 之间的随机数
     */
    static int areaRandom2(int min, int max) {
        Random random = new Random();
        return random.nextInt(max - min ) + min+ 1;
    }

    /**
     * nextDouble() 返回 [0.0,1) 之间的随机数 根据种子(无参使用系统纳秒)
     * @param min
     * @param max
     * @return
     */
    static int areaRandom3(int min,int max){
        return (int) (new Random().nextDouble()*(max - min +1) +min);
    }
}
